home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / bookmark.c < prev    next >
C/C++ Source or Header  |  1999-07-11  |  5KB  |  280 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     しおり機能
  5.  
  6.     過去に読んだことがあるテキストの表示開始位置を
  7.     記憶しておき、反映するためのしかけ
  8. */
  9.  
  10. #include    "dsh.h"
  11.  
  12. #define    DEBUG    FALSE
  13. #define    USE_HEAP    FALSE    // TRUE...ワークをヒープから確保 / FALSE...静的確保
  14.  
  15. typedef struct {
  16.     short no;        /* 次のbookmark番号(list構造もどき) */
  17.     unsigned short crc;    /* ファイルのCRC(ID) */
  18.     int ln;            /* 表示開始行番号(保存) */
  19.     char *fnm;        /* ファイル名へのポインタ~ */
  20. } BOOKMARK;
  21.  
  22. #define    USEHPSIZ    2048        /* bookmarkで使用するHEAPのサイズ */
  23. #define    BKMKMAX    ((USEHPSIZ - 16) / sizeof(BOOKMARK))
  24.                 /* しおりの最大個数(-16は管理用?領域分) */
  25.  
  26. #if    USE_HEAP
  27. static BOOKMARK *bookmark;
  28. #else
  29. static BOOKMARK bookmark[BKMKMAX];
  30. #endif
  31.  
  32. static short IMAmark = -1;    /* 現在読込中のテキスト分のmark(list先頭) */
  33. static short KAKOmark = -1;    /* 過去読込済のテキスト分のmark(list先頭) */
  34. static short NILmark = -1;    /* 未使用分のmark(list先頭) */
  35.  
  36. /*
  37.     しおりの初期化
  38.     記憶用領域はcmalloc()で確保
  39.     (どうも挙動不審(?)なんだけど…小さいめなら大丈夫か?)
  40.  
  41.     このファイル内の関数群を実行する前に必ず一度
  42.     この初期化が実行されていなければならない
  43. */
  44. int
  45. init_bookmark(void)
  46. {
  47.     int i;
  48.  
  49. #if    USE_HEAP
  50. /* printf("BKMKMAX=%x, sizeof(BOOKMARK)=%x\n", BKMKMAX, sizeof(BOOKMARK)); */
  51.     bookmark = (BOOKMARK *) calloc(BKMKMAX, sizeof(BOOKMARK));
  52.     if (bookmark == NULL) {
  53.         return 1;
  54.     }
  55. #endif
  56.     NILmark = 0;
  57.     for (i = 0; i < (BKMKMAX - 1); i++) {
  58.         bookmark[i].no = i + 1;
  59.     }
  60.     bookmark[BKMKMAX - 1].no = -1;
  61. #if DEBUG
  62.     dbg1("init_bookmark");
  63. #endif
  64.     return 0;
  65. }
  66.  
  67.  
  68.  
  69. /*
  70.     渡されたリストから、crcが合致するものを探す
  71.     有ったらしおりID(0~)、無かったら-1を返す
  72. */
  73. static int
  74. getno_sub(unsigned short crc, short startmark)
  75. {
  76.     int i = startmark;
  77.     while (i >= 0) {
  78.         if (bookmark[i].crc == crc) {
  79.             break;
  80.         }
  81.         i = bookmark[i].no;
  82.     }
  83.     return i;
  84. }
  85.  
  86.  
  87. /*
  88.     現在読み込まれ中のファイルかチェック
  89.     そうだったらしおりID(0~)違ったら-1を返す
  90. */
  91. int
  92. crc_to_IMAno(unsigned short crc)
  93. {
  94.     return getno_sub(crc, IMAmark);
  95. }
  96.  
  97.  
  98. /*
  99.     過去読み込まれたファイルかチェック
  100.     そうだったらしおりID(0~)違ったら-1を返す
  101. */
  102. int
  103. crc_to_KAKOno(unsigned short crc)
  104. {
  105.     return getno_sub(crc, KAKOmark);
  106. }
  107.  
  108.  
  109. /*
  110.     空リストを1コつぶし、現リストに追加(行番号初期化)
  111.     ない場合は過去リストより古い順にツブす
  112.     戻り値:しおりID (エラーの時は-1)
  113. */
  114. int
  115. regist_IMAmark(unsigned short crc)
  116. {
  117.     int i, n;
  118.  
  119.     n = NILmark;
  120.     if (n == -1) {
  121.         n = KAKOmark;
  122.         if (n == -1) {    /* 読込ファイルMAXよりリストMAXが多ければ起こりえないエラー */
  123.             return -1;
  124.         }
  125.         KAKOmark = bookmark[n].no;
  126.     } else {
  127.         NILmark = bookmark[n].no;
  128.     }
  129.     i = IMAmark;
  130.     if (i >= 0) {
  131.         while (bookmark[i].no != -1) {
  132.             i = bookmark[i].no;
  133.         }
  134.         bookmark[i].no = n;
  135.     } else {
  136.         IMAmark = n;
  137.     }
  138.     bookmark[n].no = -1;
  139.     bookmark[n].crc = crc;
  140.     bookmark[n].ln = 0;
  141. #if DEBUG
  142.     dbg1("regist_IMAmark");
  143. #endif
  144.     return n;
  145. }
  146.  
  147.  
  148. /*
  149.     指定のしおりIDのbookmarkを現リストから外し、
  150.     過去リスト(のしっぽ)にくっつける
  151.     戻り値:errorの時 -1
  152. */
  153. int 
  154. IMAtoKAKO(int n)
  155. {
  156.     int i;
  157.  
  158.     if (n < 0 || n >= BKMKMAX) {
  159.         return -1;
  160.     }
  161.  
  162.     i = IMAmark;
  163.     while (i != -1) {
  164.         if (bookmark[i].no == n) {
  165.             break;
  166.         }
  167.         i = bookmark[i].no;
  168.     }
  169.     if (i == -1) {
  170.         return -1;    /* 現リスト中に指定のIDのしおりがなかった */
  171.     }
  172.     bookmark[i].no = bookmark[n].no;
  173.  
  174.     i = KAKOmark;
  175.     if (i >= 0) {
  176.         while (bookmark[i].no != -1) {
  177.             i = bookmark[i].no;
  178.         }
  179.         bookmark[i].no = n;
  180.     } else {
  181.         KAKOmark = n;
  182.     }
  183.     bookmark[n].no = -1;
  184. #if DEBUG
  185.     dbg1("IMAtoKAKO");
  186. #endif
  187.     return 0;
  188. }
  189.  
  190.  
  191. /*
  192.     指定IDのしおりに、
  193.     指定の行番号をストアする
  194. */
  195. int
  196. put_ln(int no, int ln)
  197. {
  198.     if (no < 0 || no >= BKMKMAX) {
  199.         return -1;
  200.     }
  201.     bookmark[no].ln = ln;
  202.     return 0;
  203. }
  204.  
  205.  
  206. /*
  207.     指定IDのしおりから
  208.     行番号をゲットする
  209. */
  210. int
  211. get_ln(int no)
  212. {
  213.     int lno;
  214.  
  215.     if (no < 0 || no >= BKMKMAX) {
  216.         return -1;
  217.     }
  218.     lno = bookmark[no].ln;
  219.     if (lno >= lpmx)
  220.         lno = 0;
  221.  
  222.     return lno;
  223. }
  224.  
  225.  
  226.  
  227. /*
  228.     ファイル名へのポインタをセット
  229. */
  230. int 
  231. set_fnm_to_mark(int n, char *fname)
  232. {
  233.     if (n < 0 || n >= BKMKMAX) {
  234.         return -1;
  235.     }
  236.     bookmark[n].fnm = fname;
  237.     return 0;
  238. }
  239.  
  240.  
  241.  
  242.  
  243.  
  244. #if DEBUG
  245. int
  246. dbg1sub(short markhd, FILE *fp)
  247. {
  248.     int i;
  249.  
  250.     i = markhd;
  251.     while (i != -1) {
  252.         fprintf(fp, "  %d(%s)>", i, bookmark[i].fnm);
  253.         i = bookmark[i].no;
  254.     }
  255.     fprintf(fp, "  >END\n");
  256. }
  257.  
  258. int
  259. dbg1(char *nm)
  260. {
  261.     FILE *fp;
  262.  
  263.     fp = fopen("g:/bmdebug", "a");
  264.     if (fp == NULL) {
  265.         return;
  266.     }
  267.  
  268.     fprintf(fp, "%s\n", nm);
  269.     fprintf(fp, " IMAmark:\n");
  270.     dbg1sub(IMAmark, fp);
  271.     fprintf(fp, " KAKOmark:\n");
  272.     dbg1sub(KAKOmark, fp);
  273.     fprintf(fp, " NILmark:\n");
  274.     dbg1sub(NILmark, fp);
  275.     fprintf(fp, "\n");
  276.  
  277.     fclose(fp);
  278. }
  279. #endif
  280.